home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1995 October
/
EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso
/
Aminet
/
util
/
cdity
/
cx22.lha
/
CX2.2
/
Quelltext
/
ListsAndNodes.mod
< prev
Wrap
Text File
|
1994-09-09
|
3KB
|
149 lines
IMPLEMENTATION MODULE ListsAndNodes;
(* NodeSearch.mod - Einzeilige Funktionsbeschreibung
* Version : $VER: NodeSearch.mod 0.0 (© 1994 Fin Schuppenhauer)
* Autor : Fin Schuppenhauer
* Braußpark 10
* 20537 Hamburg
* (Germany)
* E-Mail : 1schuppe@rzdspc2.informatik.uni-hamburg.de
* Erstellt am : 09 Sep 1994
* Letzte Änd. : 09 Sep 1994
*)
IMPORT
ed:ExecD, el:ExecL,
str:String;
FROM SYSTEM IMPORT
CAST, ADDRESS, ADR;
CONST
EQUAL = 0;
LESS = 1;
GREATER = -1;
PROCEDURE CompareNodeNames (node1, node2 : ed.NodePtr) : LONGINT;
(** "Vergleicht die Namen zweier Exec-Nodes" *)
BEGIN
IF node1^.name = NIL THEN
IF node2^.name = NIL THEN
RETURN EQUAL;
ELSE
RETURN LESS;
END;
ELSE
IF node2^.name = NIL THEN
RETURN GREATER;
ELSE
RETURN str.Compare(CAST(StrPtr, node1^.name)^,
CAST(StrPtr, node2^.name)^);
END;
END;
END CompareNodeNames;
(* **)
PROCEDURE CountNodes (list : ed.ListPtr) : LONGCARD;
(** "Zählt die Anzahl der Nodes einer Liste" *)
VAR
count : LONGCARD;
node : ed.NodePtr;
BEGIN
count := 0;
node := list^.head;
WHILE (node # NIL) & (node^.succ # NIL) DO
INC (count);
node := node^.succ;
END;
RETURN count;
END CountNodes;
(* **)
PROCEDURE ChangeNodes (list : ed.ListPtr; node1, node2 : ed.NodePtr);
(** "Vertauscht node1 mit node2" *)
VAR
oldn1pred : ed.NodePtr;
oldn2pred : ed.NodePtr;
BEGIN
oldn1pred := node1^.pred;
IF node1^.succ = node2 THEN
(* Spezialfall !!! *)
node1^.pred^.succ := node2;
node2^.succ^.pred := node1;
node1^.succ := node2^.succ;
node1^.pred := node2;
node2^.succ := node1;
node2^.pred := oldn1pred;
ELSE
oldn2pred := node2^.pred;
el.Remove (node1);
el.Remove (node2);
el.Insert (list, node1, oldn2pred);
el.Insert (list, node2, oldn1pred);
END;
END ChangeNodes;
(* **)
PROCEDURE SortExecList (list : ed.ListPtr; max : INTEGER);
(** "Sortiert eine Exec-Liste alphabetisch anhand der node.name's" *)
VAR
a,b : INTEGER;
n : ed.NodePtr;
BEGIN
IF max = ALLNODES THEN
max := CountNodes(list);
END;
FOR a := max-1 TO 1 BY -1 DO
n := list^.head;
FOR b := 1 TO a DO
IF CompareNodeNames (n, n^.succ) > 0 THEN
ChangeNodes (list, n, n^.succ);
n := n^.pred;
END;
n := n^.succ;
END;
END;
END SortExecList;
(* **)
PROCEDURE Enumerate (list : ed.ListPtr; enumProc : EnumerateProcedure);
(** "Prozedur enumProc auf jede Node anwenden" *)
VAR
node : ed.NodePtr;
BEGIN
node := list^.head;
WHILE (node # NIL) & (node^.succ # NIL) DO
enumProc (node);
node := node^.succ;
END;
END Enumerate;
(* **)
PROCEDURE FreeAllNodes (list : ed.ListPtr; nodesize : CARDINAL);
(** "Belegten Speicher aller Nodes einer Liste freigeben" *)
VAR
worknode, node : ed.NodePtr;
BEGIN
node := list^.head;
WHILE (node # NIL) & (node^.succ # NIL) DO
worknode := node;
node := node^.succ;
el.FreeMem (worknode, nodesize);
END;
list^.head := NIL;
list^.tailPred := NIL;
END FreeAllNodes;
(* **)
BEGIN (* main *)
END ListsAndNodes.